using System;
using System.Collections.Generic;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;
using NHibernate;

namespace Neturion.Repositorios
{
    public class RepositorioCheque : IRepositorioCheque 
    {
        public Cheque Inserir(Cheque cheque)
        {
            foreach (Pagamento pagamento in cheque.ListaPagamentosCheque)
            {
                pagamento.Cheque = cheque;
            }

            foreach (SituacaoCheque situacaoCheque in cheque.ListaSituacoes)
            {
                situacaoCheque.Cheque = cheque;
            }

            GerenciadorBDConfigs.Instance.SessaoAtual().Save(cheque);
            return cheque;
        }

        public Cheque Atualizar(Cheque cheque)
        {
            Cheque chequeTmp = ObterPorId(cheque.ChequeId);
            //Passagens dos Atributos
            chequeTmp.C1 = cheque.C1;
            chequeTmp.C2 = cheque.C2;
            chequeTmp.C3 = cheque.C3;
            chequeTmp.Compensacao = cheque.Compensacao;
            chequeTmp.ContaBanco = cheque.ContaBanco;
            chequeTmp.DataBomPara = cheque.DataBomPara;
            chequeTmp.DataEmissao = cheque.DataEmissao;
            chequeTmp.Destinatario = cheque.Destinatario;
            chequeTmp.EnumTipoCheque = cheque.EnumTipoCheque;
            chequeTmp.Numero = cheque.Numero;
            chequeTmp.Observacao = cheque.Observacao;
            chequeTmp.Serie = cheque.Serie;
            chequeTmp.Valor = cheque.Valor;

            chequeTmp.ListaPagamentosCheque.Clear();
            foreach (Pagamento pagamento in cheque.ListaPagamentosCheque)
            {
                chequeTmp.AdicionarPagamento(pagamento);
            }

            chequeTmp.ListaSituacoes.Clear();
            foreach (SituacaoCheque situacaoCheque in cheque.ListaSituacoes)
            {
                chequeTmp.AdicionarSituacao(situacaoCheque);
            }

            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(chequeTmp);
            return chequeTmp;
        }

        public void Excluir(Cheque cheque)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(cheque);
        }

        public IList<Cheque> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Cheque));
            return criteria.List<Cheque>() as List<Cheque>;
        }

        public Cheque ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<Cheque>(id);
        }

        public IList<Cheque> ObterTodos(int inicio, int quantidade, int quantidadeMinima, EnumTipoCheque enumTipoCheque, 
                                        string numero, Pessoa titular, Pessoa destinatario, ContaBanco contaBanco, DateTime? bomParaDe, 
                                        DateTime? bomParaAte, DateTime? emissaoDe, DateTime? emissaoAte)
        {
            if (quantidade.Equals(0))
            {
                quantidade = quantidadeMinima;
            }

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Cheque))
               .SetFirstResult(inicio).SetMaxResults(quantidade);

            if(!string.IsNullOrEmpty(numero))
            {
                criteria.Add(Restrictions.Eq("Numero", numero));
            }

            if(enumTipoCheque >= 0)
            {
                criteria.Add(Restrictions.Eq("EnumTipoCheque", enumTipoCheque));
            }

            if(titular != null)
            {
                criteria.Add(Restrictions.Eq("ContaBanco.Titular", titular));
            }

            if (destinatario != null)
            {
                criteria.Add(Restrictions.Eq("Destinatario", destinatario));
            }

            if (contaBanco != null)
            {
                criteria.Add(Restrictions.Eq("ContaBanco", contaBanco));
            }

            if (bomParaDe.HasValue)
            {
                criteria.Add(bomParaAte.HasValue
                    ? Restrictions.Between("InicioVigencia", bomParaDe.Value.Date, bomParaAte.Value.Date)
                    : Restrictions.Eq("InicioVigencia", bomParaDe.Value.Date))
                ;
            }

            if (emissaoDe.HasValue) 
            {
                criteria.Add(emissaoAte.HasValue
                    ? Restrictions.Between("FimVigencia", emissaoDe.Value.Date, emissaoAte.Value.Date)
                    : Restrictions.Eq("FimVigencia", emissaoDe.Value.Date));
            }

            return criteria.List<Cheque>() as List<Cheque>;
        }
    }
}